package com.zhdl.common.constant;

import lombok.AllArgsConstructor;
import lombok.Getter;

/**
 * 返回状态码
 */
@Getter
@AllArgsConstructor
public enum HttpCodeEnum {
    //---信息响应 (100–199)
    /**
     * 临时响应表明
     */
    CONTINUE(100, "临时响应"),
    /**
     * 响应客户端的 Upgrade (en-US) 请求头发送的，指明服务器即将切换的协议。
     */
    SWITCHING_PROTOCOLS(101, "服务器即将切换的协议"),
    /**
     * 服务器已收到并正在处理该请求，但当前没有响应可用。
     */
    PROCESSING(102, "没有响应可用"),
    /**
     * 允许用户代理在服务器准备响应阶段时开始预加载 preloading 资源。
     */
    EARLY_HINTS(103, "开始预加载资源"),
    //-- 成功响应 (200–299)
    /**
     * 操作成功
     */
    SUCCESS(200, "操作成功"),

    /**
     * 对象创建成功
     */
    CREATED(201, "对象创建成功"),

    /**
     * 请求已经被接受
     */
    ACCEPTED(202, "请求已经被接受"),
    /**
     * 服务器已成功处理了请求，但返回的实体头部元信息不是在原始服务器上有效的确定集合，而是来自本地或者第三方的拷贝
     */
    NON_AUTHORITATIVE_INFORMATION(203, "服务器已成功处理了请求"),
    /**
     * 操作已经执行成功，但是没有返回数据
     */
    NO_CONTENT(204, "操作已经执行成功，但是没有返回数据"),
    /**
     * 告诉用户代理重置发送此请求的文档
     */
    RESET_CONTENT(205, "告诉用户代理重置发送此请求的文档"),
    /**
     * 当从客户端发送Range范围标头以只请求资源的一部分时，将使用此响应代码。
     */
    PARTIAL_CONTENT(206, "客户端发送的数据不完整"),

    // 重定向消息 (300–399)
    /**
     * 请求拥有多个可能的响应。用户代理或者用户应当从中选择一个
     */
    MULTIPLE_CHOICE(300, "可能有多个响应"),
    /**
     * 资源已被移除
     */
    MOVED_PERM(301, "资源已被移除"),

    /**
     * 此响应代码表示所请求资源的 URI 已 暂时 更改
     */
    FOUND(302, "重定向状态码"),
    /**
     * 重定向
     */
    SEE_OTHER(303, "重定向"),

    /**
     * 资源没有被修改
     */
    NOT_MODIFIED(304, "资源没有被修改"),

    /**
     * 但用户代理 不能 更改所使用的 HTTP 方法
     */
    TEMPORARY_REDIRECT(307, "服务器发送此响应"),
    /**
     * 资源现在永久位于由Location: HTTP Response 标头指定的另一个 URI
     */
    PERMANENT_REDIRECT(308, "资源现在永久位于由Location"),

    // 客户端错误响应 (400–499)
    /**
     * 参数列表错误（缺少，格式不匹配）
     */
    BAD_REQUEST(400, "参数列表错误（缺少，格式不匹配）"),
    /**
     * 未授权
     */
    UNAUTHORIZED(401, "未授权"),
    /**
     * 访问受限，授权过期
     */
    FORBIDDEN(403, "访问受限，授权过期"),
    /**
     * 资源，服务未找到
     */
    NOT_FOUND(404, "资源，服务未找到"),
    /**
     * 不允许的请求方法
     */
    METHOD_NOT_ALLOWED(405, "不允许的请求方法"),
    /**
     * 没有发现任何符合用户代理给定标准的内容
     */
    NOT_ACCEPTABLE(406, "没有发现任何符合用户标准"),
    /**
     * 类似于 401 Unauthorized 但是认证需要由代理完成。
     */
    PROXY_AUTHENTICATION_REQUIRED(407, "认证需要由代理完成"),
    /**
     * 请求超时
     */
    REQUEST_TIMEOUT(408, "请求超时"),
    /**
     * 资源冲突，或者资源被锁
     */
    CONFLICT(409, "资源冲突，或者资源被锁"),
    /**
     * 内容已从服务器中永久删除
     */
    GONE(410, "内容已从服务器中永久删除"),
    /**
     * 服务端拒绝该请求因为 Content-Length 头部字段未定义但是服务端需要它
     */
    LENGTH_REQUIRED(411, "服务端拒绝该请求因为 Content-Length 头部字段未定义但是服务端需要它"),
    /**
     * 客户端在其头文件中指出了服务器不满足的先决条件
     */
    PRECONDITION_FAILED(412, "客户端在其头文件中指出了服务器不满足的先决条件"),

    /**
     * 请求实体大于服务器定义的限制，可能会关闭连接
     */
    PAYLOAD_TOO_LARGE(413, "请求实体大于服务器定义的限制"),
    /**
     * 客户端请求的 URI 比服务器愿意接收的长度长
     */
    URI_TOO_LONG(414, "客户端请求的 URI 比服务器愿意接收的长度长"),
    /**
     * 服务器不支持请求数据的媒体格式
     */
    UNSUPPORTED_MEDIA_TYPE(415, "服务器不支持请求数据的媒体格式"),
    /**
     * 无法满足请求中 Range 标头字段指定的范围。该范围可能超出了目标 URI 数据的大小。
     */
    RANGE_NOT_SATISFIABLE(416, "超出了目标 URI 数据的大小"),
    /**
     * 服务器无法满足 Expect 请求标头字段所指示的期望
     */
    EXPECTATION_FAILED(417, "服务器无法满足 Expect 请求标头字段所指示的期望"),
    /**
     * 请求被定向到无法生成响应的服务器
     */
    MISDIRECTED_REQUEST(421, "请求被定向到无法生成响应的服务器"),
    /**
     * 请求格式正确，但由于语义错误而无法遵循
     */
    UNPROCESSABLE_ENTITY(422, "请求格式正确，但由于语义错误而无法遵循"),
    /**
     * 正在访问的资源已锁定
     */
    LOCKED(423, "正在访问的资源已锁定"),
    /**
     * 由于前一个请求失败，请求失败
     */
    FAILED_DEPENDENCY(424, "由于前一个请求失败，请求失败"),
    /**
     * 服务器拒绝使用当前协议执行请求
     */
    UPGRADE_REQUIRED(426, "服务器拒绝使用当前协议执行请求"),
    /**
     * 源服务器要求请求是有条件的。此响应旨在防止'丢失更新'问题，即当第三方修改服务器上的状态时，客户端 GET 获取资源的状态，对其进行修改并将其 PUT 放回服务器，从而导致冲突。
     */
    PRECONDITION_REQUIRED(428, "源服务器要求请求是有条件的"),
    /**
     * 用户在给定的时间内发送了太多请求
     */
    TOO_MANY_REQUESTS(429, "限制请求速率"),
    /**
     * 服务器不愿意处理请求，因为其头字段太大
     */
    REQUEST_HEADER_FIELDS_TOO_LARGE(431, "服务器不愿意处理请求，因为其头字段太大"),
    /**
     * 用户代理请求了无法合法提供的资源
     */
    UNAVAILABLE_FOR_LEGAL_REASONS(451, "用户代理请求了无法合法提供的资源"),
    /**
     * 不支持的数据，媒体类型
     */
    UNSUPPORTED_TYPE(461, "不支持的数据，媒体类型"),
    /**
     * 不允许的http方法
     */
    BAD_METHOD(462, "不允许的http方法"),
    /**
     * 解包请求消息失败
     */
    UNPACKING_FAILED(463, "解包请求消息失败"),
    /**
     * 签名验证失败
     */
    SIGNATURE_VERIFICATION_FAILED(464, "签名验证失败"),
    /**
     * 签名信息超出长度
     */
    SIGNATURE_INFORMATION_EXCEEDS_LENGTH(465, "签名信息超出长度"),
    /**
     * 接口调用错误
     */
    INTERFACE_CALL_ERROR(466, "接口调用错误"),
    /**
     * 参数不能为空
     */
    PARAMETER_NOT_EMPTY(467, "参数不能为空"),

    //---服务端错误响应 (500–599)
    /**
     * 系统内部错误
     */
    INTERNAL_SERVER_ERROR(500, "系统内部错误"),

    /**
     * 服务器不支持请求方法
     */
    NOT_IMPLEMENTED(501, "服务器不支持请求方法"),
    /**
     * 网关错误
     */
    BAD_GATEWAY(502, "网关错误"),
    /**
     * 服务器没有准备好处理请求
     */
    SERVICE_UNAVAILABLE(503, "服务器没有准备好处理请求"),
    /**
     * 网关超时
     */
    GATEWAY_TIMEOUT(504, "网关超时"),

    /**
     * 服务器不支持请求中使用的 HTTP 版本
     */
    HTTP_VERSION_NOT_SUPPORTED(505, "服务器不支持请求中使用的 HTTP 版本"),

    /**
     * 服务器存在内部配置错误
     */
    VARIANT_ALSO_NEGOTIATES(506, "服务器存在内部配置错误"),
    /**
     * 无法在资源上执行该方法
     */
    INSUFFICIENT_STORAGE(507, "无法在资源上执行该方法"),
    /**
     * 服务器在处理请求时检测到无限循环
     */
    LOOP_DETECTED(508, "服务器在处理请求时检测到无限循环"),
    /**
     * 服务器需要对请求进行进一步扩展才能完成请求
     */
    NOT_EXTENDED(510, "服务器需要对请求进行进一步扩展才能完成请求"),
    /**
     * 客户端需要进行身份验证才能获得网络访问权限
     */
    NETWORK_AUTHENTICATION_REQUIRED(511, "客户端需要进行身份验证才能获得网络访问权限"),
    /**
     * 系统繁忙，序列化失败
     */
    SYSTEM_BUSY_ERROR(522, "系统繁忙，序列化失败"),

    /**
     * 数据库操作异常
     */
    SQL_EXEC_ERROR(523, "数据库操作异常"),
    /**
     * 超时异常
     */
    TIMEOUT_ERROR(524, "超时异常"),
    /**
     * 存储信息重复
     */
    DUPLICATE_STORAGE_INFORMATION(525, "存储信息重复"),
    /**
     * 批处理失败
     */
    BATCH_FAILED(526, "批处理失败"),
    ;

    /**
     * 执行返回码
     *
     * @mock 0
     * @since v1.0
     */
    private int code;

    /**
     * 返回说明
     *
     * @mock 成功
     * @since v1.0
     */
    private String msg;
}
